package com.dyna.utils;//package com.dyna.utils;
//
//import cn.hutool.core.collection.CollectionUtil;
//import cn.hutool.core.lang.Pair;
//import cn.hutool.core.util.StrUtil;
//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
//import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
//import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
//import com.baomidou.mybatisplus.extension.service.IService;
//import com.dyna.api.request.CursorPageBaseReq;
//import com.dyna.api.response.CursorPageBaseResp;
//import org.springframework.data.redis.core.ZSetOperations;
//import org.springframework.stereotype.Component;
//
//import java.util.List;
//import java.util.Optional;
//import java.util.Set;
//import java.util.function.Consumer;
//import java.util.function.Function;
//import java.util.stream.Collectors;
//
///**
// * Description: 游标分页工具类
// * Author: <a href="https://github.com/zongzibinbin">abin</a>
// * Date: 2023-03-28
// * @author zhoucaiwang
// */
//@Component
//public class CursorUtils {
//
//    public <T> CursorPageBaseResp<Pair<T, Double>> getCursorPageByRedis(CursorPageBaseReq cursorPageBaseReq, String redisKey, Function<String, T> typeConvert) {
//        Set<ZSetOperations.TypedTuple<String>> typedTuples;
//        // 第一次
//        if (StrUtil.isBlank(cursorPageBaseReq.getCursor())) {
//            typedTuples = RedisUtils.zReverseRangeWithScores(redisKey, cursorPageBaseReq.getPageSize());
//        } else {
//            typedTuples = RedisUtils.zReverseRangeByScoreWithScores(redisKey, Double.parseDouble(cursorPageBaseReq.getCursor()), cursorPageBaseReq.getPageSize());
//        }
//        List<Pair<T, Double>> result = typedTuples
//                .stream()
//                .map(t -> Pair.of(typeConvert.apply(t.getValue()), t.getScore()))
//                .sorted((o1, o2) -> o2.getValue().compareTo(o1.getValue()))
//                .collect(Collectors.toList());
//        String cursor = Optional.ofNullable(CollectionUtil.getLast(result))
//                .map(Pair::getValue)
//                .map(String::valueOf)
//                .orElse(null);
//        Boolean isLast = result.size() != cursorPageBaseReq.getPageSize();
//        return new CursorPageBaseResp<>(cursor, isLast, result);
//    }
//
//    public <T> CursorPageBaseResp<T> getCursorPageByMysql(IService<T> mapper, CursorPageBaseReq request, Consumer<LambdaQueryWrapper<T>> initWrapper, SFunction<T, ?> cursorColumn) {
//        LambdaQueryWrapper<T> wrapper = new LambdaQueryWrapper<>();
//        initWrapper.accept(wrapper);
//        if (StrUtil.isNotBlank(request.getCursor())) {
//            wrapper.lt(cursorColumn, request.getCursor());
//        }
//        wrapper.orderByDesc(cursorColumn);
//        Page<T> page = mapper.page(request.plusPage(), wrapper);
//        String cursor = Optional.ofNullable(CollectionUtil.getLast(page.getRecords()))
//                .map(cursorColumn)
//                .map(String::valueOf)
//                .orElse(null);
//        Boolean isLast = page.getRecords().size() != request.getPageSize();
//        return new CursorPageBaseResp<>(cursor, isLast, page.getRecords());
//    }
//
//}
